﻿// Two-SAT.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>



using  namespace std;


/*


https://www.acwing.com/problem/content/2404/
给定 n 个还未赋值的布尔变量 x1∼xn。

现在有 m 个条件，每个条件的形式为 “xi 为 0/1 或 xj 为 0/1 至少有一项成立”，
例如 “x1 为 1 或 x3 为 0”、“x8 为 0 或 x4 为 0” 等。

现在，请你对这 n 个布尔变量进行赋值（0 或 1），使得所有 m 个条件能够成立。

输入格式
第一行包含两个整数 n,m。

接下来 m 行，每行包含四个整数 i,a,j,b，用来描述一个条件，表示 “xi 为 a 或 xj 为 b”。

输出格式
如果问题有解，则第一行输出 POSSIBLE，第二行输出 n 个整数表示赋值后的 n 个变量 x1∼xn 的值（0 或 1），
整数之间用单个空格隔开。

如果问题无解，则输出一行 IMPOSSIBLE 即可。

如果答案不唯一，则输出任意一种正确答案即可。

数据范围
1≤n,m≤106,
1≤i,j≤n,
0≤a,b≤1
输入样例：
3 2
1 1 3 1
2 0 3 0
输出样例：
POSSIBLE
1 1 0
*/


/*
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

const int N = 2000010, M = 2000010;

int n, m;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N], ts, stk[N], top;
int id[N], cnt;
bool ins[N];

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void tarjan(int u)
{
	dfn[u] = low[u] = ++ ts;
	stk[ ++ top] = u, ins[u] = true;
	for (int i = h[u]; ~i; i = ne[i])
	{
		int j = e[i];
		if (!dfn[j])
		{
			tarjan(j);
			low[u] = min(low[u], low[j]);
		} else if (ins[j]) low[u] = min(low[u], dfn[j]);
	}

	if (low[u] == dfn[u])
	{
		int y;
		cnt ++ ;
		do
		{
			y = stk[top -- ], ins[y] = false, id[y] = cnt;
		} while (y != u);
	}
}

int main()
{
	scanf("%d%d", &n, &m);
	memset(h, -1, sizeof h);

	while (m -- )
	{
		int i, a, j, b;
		scanf("%d%d%d%d", &i, &a, &j, &b);
		i --, j -- ;
		add(2 * i + !a, 2 * j + b);
		add(2 * j + !b, 2 * i + a);
	}

	for (int i = 0; i < n * 2; i ++ )
		if (!dfn[i])
			tarjan(i);

	for (int i = 0; i < n; i ++ )
		if (id[i * 2] == id[i * 2 + 1])
		{
			puts("IMPOSSIBLE");
			return 0;
		}

	puts("POSSIBLE");
	for (int i = 0; i < n; i ++ )
		if (id[i * 2] < id[i * 2 + 1]) printf("0 ");
		else printf("1 ");

	return 0;
}

*/

int main()
{
    std::cout << "Hello World!\n";
}
 